package cl.gob.minvu.catastromobile;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import cl.gob.minvu.catastromobile.entities.GrupoSecundario;
import cl.gob.minvu.catastromobile.util.GenericUtil;
import com.google.gson.Gson;

import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;

/**
 * @author psep
 * 
 */
public class GrupoSecundarioActivity extends AbstractActivity {

	private EditText nombre;
	private EditText apellido;
	private EditText run;
	private EditText dv;
	private EditText fono;
	private EditText totalIntegrantes;
	private Spinner ocupacion;
	private GrupoSecundario grupoSecundario;
	private boolean isUpdate;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_grupo_secundario);
		super.session = super.getSharedPreferences(GenericUtil.SESSION,
				MODE_PRIVATE);
		this.nombre = (EditText) super
				.findViewById(R.id.editTextNombreSecundario);
		this.apellido = (EditText) super
				.findViewById(R.id.editTextApellidoSecundario);
		this.run = (EditText) super.findViewById(R.id.editTextRutSecundario);
		this.dv = (EditText) super.findViewById(R.id.editTextDvSecundario);
		this.fono = (EditText) super.findViewById(R.id.editTextFonoSecundario);
		this.totalIntegrantes = (EditText) super
				.findViewById(R.id.editTextTotalSecundario);
		this.ocupacion = (Spinner) super.findViewById(R.id.spinnerOcupacionSec);
		this.onLoadSession();
	}

	/**
	 * Método que valida si existe un objeto en sesión desplegándolo en el
	 * formulario.
	 */
	private void onLoadSession() {
		String grupoJson = super.session.getString(GenericUtil.GRUPO_SECUNDARIO, null);

		if (grupoJson == null) {
			this.isUpdate = false;
		} else {
			this.isUpdate = true;
			Gson gson = new Gson();
			this.grupoSecundario = gson.fromJson(grupoJson,
					GrupoSecundario.class);
			this.loadTextFrm();
		}
	}

	/**
	 * Método que carga el objeto (si no es nulo) en el formulario.
	 */
	private void loadTextFrm() {
		if (this.grupoSecundario != null) {
			this.nombre.setText(this.grupoSecundario.nombre);
			this.apellido.setText(this.grupoSecundario.apellidoPaterno);
			this.run.setText(String.valueOf(this.grupoSecundario.run));
			this.dv.setText(this.grupoSecundario.dv);
			this.fono.setText(String.valueOf(this.grupoSecundario.telefono));
			this.totalIntegrantes.setText(String
					.valueOf(this.grupoSecundario.totalIntegrantes));
			this.ocupacion.setSelection(this.grupoSecundario.ocupacionVivienda);
			this.run.setEnabled(false);
			this.dv.setEnabled(false);
		}
	}

	/**
	 * Método que carga los valores del formulario en el objeto de
	 * GrupoSecundario
	 */
	private void loadGrupoSecundario() {
		this.grupoSecundario = new GrupoSecundario();
		this.grupoSecundario.nombre = super.getStringEditText(this.nombre);
		this.grupoSecundario.apellidoPaterno = super
				.getStringEditText(this.apellido);
		this.grupoSecundario.run = GenericUtil.stringToInt(super
				.getStringEditText(this.run));
		this.grupoSecundario.dv = super.getStringEditText(this.dv);
		this.grupoSecundario.telefono = GenericUtil.stringToInt(super
				.getStringEditText(this.fono));
		this.grupoSecundario.totalIntegrantes = GenericUtil.stringToInt(super
				.getStringEditText(this.totalIntegrantes));
		this.grupoSecundario.ocupacionVivienda = super
				.getIdSpinner(this.ocupacion);
	}

	/**
	 * @param button
	 */
	public void onClickSaveSecundario(View button) {
		if (this.validateFrm()) {
			this.loadGrupoSecundario();
			
			if (!this.isUpdate && this.isExists()) {
				super.toastMsg("El RUN ya está en la lista");
			} else {
				Gson gson = new Gson();
				String json = super.session.getString(GenericUtil.LIST_SECUNDARIO, null);
				List<GrupoSecundario> secundarios = new ArrayList<GrupoSecundario>();
				List<GrupoSecundario> grupos = null;
				
				if (json != null) {
					grupos = Arrays.asList(gson.fromJson(json, GrupoSecundario[].class));
				} else {
					grupos = new ArrayList<GrupoSecundario>();
				}
				
				for (GrupoSecundario grupoSec : grupos) {
					if (grupoSec.run != this.grupoSecundario.run) {
						secundarios.add(grupoSec);
					}			
				}
				
				secundarios.add(this.grupoSecundario);
				
				String jsonList = gson.toJson(secundarios.toArray());
				
				Editor edit = super.session.edit();
				edit.remove(GenericUtil.GRUPO_SECUNDARIO);
				edit.putString(GenericUtil.LIST_SECUNDARIO, jsonList);
				edit.commit();
				
				super.go(ListGrupoSecundarioActivity.class);
				
				finish();
			}
		}
	}

	@Override
	public void reset() {
	}
	
	/**
	 * @return
	 */
	private boolean isExists() {
		String json = super.session.getString(GenericUtil.LIST_SECUNDARIO, null);
		
		GrupoSecundario[] grupoArr = new Gson().fromJson(json, GrupoSecundario[].class);
		
		if (grupoArr != null && grupoArr.length > 0) {
			List<GrupoSecundario> grupos = Arrays.asList(grupoArr);
			
			for (GrupoSecundario grupo : grupos) {
				if (grupo.run == this.grupoSecundario.run){
					return true;
				}
			}
		}
		
		return false;
	}

	@Override
	public boolean validateFrm() {
		int valida = 0;

		if (super.getStringEditText(this.nombre).length() == 0) {
			this.nombre.setError("Debe ingresar el nombre del Jefe de Familia");
			valida = valida + 1;
		}
		
		if (super.getStringEditText(this.fono).length() < 8) {
			this.fono.setError("Teléfono no válido");
			valida = valida + 1;
		}

		if (super.getStringEditText(this.apellido).length() == 0) {
			this.apellido
					.setError("Debe ingresar el Apellido Paterno del Jefe de Familia");
			valida = valida + 1;
		}

		if (super.getStringEditText(this.run).length() == 0
				|| super.getStringEditText(this.dv).length() == 0) {
			this.run.setError("Debe ingresar el RUN completo del Jefe de Familia");
			this.dv.setError("Debe ingresar el RUN completo del Jefe de Familia");
			valida = valida + 1;
		} else if (!GenericUtil.validateRun(
				GenericUtil.stringToInt(super.getStringEditText(this.run)),
				super.getStringEditText(this.dv).toCharArray()[0])) {
			this.run.setError("Debe ser un RUN válido");
			this.dv.setError("Debe ser un RUN válido");
			valida = valida + 1;
		}
		
		if (valida == 0) {
			return true;
		} else {
			return false;
		}
	}
}
